﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using common.pages;
using Com.queryzer2.Domain.Entities;
using common;
using Com.queryzer2.Domain;
using Com.AlbLab.CR.Web.controls;

namespace Com.AlbLab.CR.Web.pages
{
    public partial class Fase : BasePage
    {
        protected string currentFaseId
        {
            get { return hidFaseId.Value; }
            set { hidFaseId.Value = value; }
        }
        protected string currentPraticaId
        {
            get { return hidPraticaId.Value; }
            set { hidPraticaId.Value = value; }
        }
        protected string currentServiceId
        {
            get { return hidServiceId.Value; }
            set { hidServiceId.Value = value; }
        }
        protected string currentProgrFase
        {
            get { return hidProgrFase.Value; }
            set { hidProgrFase.Value = value; }
        }
        protected string currentNroFase
        {
            get { return hidNumFase.Value; }
            set { hidNumFase.Value = value; }
        }

        private GEP_FASE entity;
        public GEP_FASE Entity
        {
            get{return entity;}
            set{entity=value;}
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack && common.TempSession.getBag() != null && common.TempSession.getBag().tipo == "CODICE_FASE")
            {
                currentFaseId = common.TempSession.getBag().valore.ToString();
                bindNew(true);
            }

        }

        protected override void Page_PreRender(object sender, EventArgs e)
        {
            base.Page_PreRender(sender, e);
            if ((ddlStato.SelectedValue.Equals("98") || ddlStato.SelectedValue.Equals("99")) && !entity.Fas_Dt_Finelav.HasValue)
            {
                pnlFaseSuccessiva.Visible = true;
            }
            else pnlFaseSuccessiva.Visible = false;

            if (entity.Fas_Dt_Finelav.HasValue)
            {
                btnCloseFase.Visible = false;
                btnClosePrt.Visible = false;
                btnChiudiFase.Visible = false;
                btnSaveAppuntamento.Visible = false;
                btnSaveDatiGenerali.Visible = false;
                btnSaveDocumentazione.Visible = false;
                btnSaveSospensione.Visible = false;
            }

            else if (entity.Fas_Stato.Equals("1"))
            {
                btnCloseFase.Visible = false;
                btnClosePrt.Visible = false;
                btnChiudiFase.Visible = false;
                pnlDatiAppuntamento.Visible = false;
                pnlRichiestaDoc.Visible = false;
                pnlSospensione.Visible = false;
            }
            else if (entity.Fas_Stato !="1" && entity.Fas_Stato !="98" && entity.Fas_Stato !="99")
            {
                btnCloseFase.Visible = true;
                btnClosePrt.Visible = true;
                btnChiudiFase.Visible = true;
                pnlDatiAppuntamento.Visible =true;
                pnlRichiestaDoc.Visible = true;
                pnlSospensione.Visible = true;
            }

            else
            {
                pnlDatiAppuntamento.Visible = true;
                pnlRichiestaDoc.Visible = true;
                pnlSospensione.Visible = true;
            }
           
        }

        protected void Page_DataBind(object sender, EventArgs e)
        {
            PraticaViewerSmall1.entity = this.entity.Gep_testata;
            
                Upload1.Id = this.entity.Documento.Blb_Id.ToString();
                Upload1.Filename = this.entity.Documento.Blb_intestazione_doc;
            
            ddlMotivoSosp.DataSource = BasePage.Services.AnagraficheService.getMotiviStatoSospensione().Values;
            ddlMotivoSosp.DataValueField = "Id_mfa_cod_motiv";
            ddlMotivoSosp.DataTextField = "Mfa_des_motiv";
            if (!string.IsNullOrEmpty(entity.Fas_Motivaz_Sosp))
            ddlMotivoSosp.SelectedValue = entity.Fas_Motivaz_Sosp;

            ddlEndFase.DataSource = BasePage.Services.AnagraficheService.getMotiviStatoChiusura().Values;
            ddlEndFase.DataValueField = "Id_mfa_cod_motiv";
            ddlEndFase.DataTextField = "Mfa_des_motiv";
            if(!string.IsNullOrEmpty( entity.Fas_Motivaz_Chiusura))
            ddlEndFase.SelectedValue = entity.Fas_Motivaz_Chiusura;
        }

        protected void ddlStato_DataBind(object sender, EventArgs e)
        {
            ddlStato.Items.Clear();
            Dictionary<string,GEP_ANA_STATOF> t = BasePage.Services.AnagraficheService.getListaStatiFase();
           
            foreach(KeyValuePair<string,GEP_ANA_STATOF> temp in t)
            {
                //fase in attesa di apertura
                if(entity.Fas_Stato.Equals("1") &&(temp.Key.Equals("1") || temp.Key.Equals("2")))
                    ddlStato.Items.Add(new ListItem(temp.Value.Stf_des_stato, temp.Value.Id_stf_cod_stato)); 
                //fase in lavorazione
                if (entity.Fas_Stato.Equals("2") && !temp.Key.Equals("1") && !temp.Key.Equals("98") && !temp.Key.Equals("99") && !temp.Key.Equals("97"))
                    ddlStato.Items.Add(new ListItem(temp.Value.Stf_des_stato, temp.Value.Id_stf_cod_stato));
                //fase chiusa
                if (entity.Fas_Stato.Equals("98") && entity.Fas_Stato.Equals("98"))
                    ddlStato.Items.Add(new ListItem(temp.Value.Stf_des_stato, temp.Value.Id_stf_cod_stato));
                //pratica chiusa
                if (entity.Fas_Stato.Equals("99") && entity.Fas_Stato.Equals("99"))
                    ddlStato.Items.Add(new ListItem(temp.Value.Stf_des_stato, temp.Value.Id_stf_cod_stato));
            }
            
            ddlStato.SelectedValue = entity.Fas_Stato;
        }

        protected void ddlNextFase_DataBind(object sender, EventArgs e)
        {
            ddlNextFase.Items.Clear();
            Dictionary<GEP_ANA_FASE.GEP_ANA_FASE_ID, GEP_ANA_FASE> t = BasePage.Services.AnagraficheService.getListaFasi();

            foreach (KeyValuePair<GEP_ANA_FASE.GEP_ANA_FASE_ID, GEP_ANA_FASE> temp in t)
            {
               if(temp.Value.Id_afa_cod_servizio==entity.Fas_cod_servizio)
                   ddlNextFase.Items.Add(new ListItem(temp.Value.Afa_des_fase, temp.Value.Id_afa_nro_fase.ToString()));
            }
        }
        
        protected void btnNav_OnClick(object sender, EventArgs e)
        {
            decimal resp=0;
            if (((System.Web.UI.WebControls.Button)(sender)).CommandArgument.Equals("next"))
                resp = BasePage.Services.GestioneFasiService.getSiblingFaseID(decimal.Parse(currentPraticaId),decimal.Parse(currentProgrFase), true);
            else
                resp = BasePage.Services.GestioneFasiService.getSiblingFaseID(decimal.Parse(currentPraticaId), decimal.Parse(currentProgrFase), false);
            
            if (resp != 0)
                common.TempSession.setBag("CODICE_FASE", resp);
            else
                common.TempSession.setBag("CODICE_FASE", decimal.Parse(currentFaseId));
            Response.Redirect("Fase.aspx");
        }
        
        protected void btnSaveDatiGenerali_OnClick(object sender, EventArgs e)
        {
            GEP_FASE temp = ParseFormData();
            Info i = BasePage.Services.GestioneFasiService.updateStatoFase(ref temp);
            entity = temp;
            bindNew(false);
        }

        protected void btnSaveAppuntamento_OnClick(object sender, EventArgs e)
        {
            GEP_FASE temp = ParseFormData();
            Info i = BasePage.Services.GestioneFasiService.updateAppuntamento(ref temp);

            if (i.messageCount() > 0)
                info = i;
           
                entity = temp;
                bindNew(false);
            
        }
        protected void btnSaveDocumentazione_OnClick(object sender, EventArgs e)
        {
            GEP_FASE temp = ParseFormData();
            Info i=BasePage.Services.GestioneFasiService.updateRichiestaDocumentaizoneFase(ref temp);

            if (i.messageCount() > 0)
                info = i;

            entity = temp;
            bindNew(false);
        }
        protected void btnSaveSospensione_OnClick(object sender, EventArgs e)
        {
            GEP_FASE temp = ParseFormData();
            Info i=BasePage.Services.GestioneFasiService.updateSospensioneFase(ref temp);
            
            if (i.messageCount() > 0)
                info = i;

            entity = temp;
            bindNew(false);
        }

        protected void btnClosePrt_OnClick(object sender, EventArgs e)
        {
            
            GEP_FASE temp = ParseFormData();
            Info i = BasePage.Services.GestioneFasiService.closeFaseAndPratica(ref temp);
            if (i.messageCount() > 0)
            {
                info = i;
                entity = temp;
                bindNew(false);
            }
            else
            {
                common.TempSession.setBag("CODICE_PRATICA", PraticaViewerSmall1.Pratica_id);
                Response.Redirect("Pratica.aspx");
            }
        }
        
        protected void btnInitFase_OnClick(object sender, EventArgs e)
        {
            //chiusura fase attuale
            GEP_FASE temp = ParseFormData();
            GEP_FASE tnew = new GEP_FASE();
            temp.Gep_ana_motstafase_chiusura = BasePage.Services.AnagraficheService.getMotiviStatoChiusura()[ddlEndFase.SelectedValue];
            temp.Gep_ana_statof.Id_stf_cod_stato = "98";
            //nuova fase
            
            tnew.Gep_ana_fase = BasePage.Services.AnagraficheService.getListaFasi()[new GEP_ANA_FASE.GEP_ANA_FASE_ID(temp.Fas_cod_servizio, decimal.Parse(ddlNextFase.SelectedValue))];
            tnew.Gep_testata = common.SessionManager<GEP_TESTATA>.get(SessionKeys.CURRENT_TESTATA);
            tnew.Fas_Progr_Fase = temp.Fas_Progr_Fase + 1;
            tnew.Gep_ana_statof = BasePage.Services.AnagraficheService.getListaStatiFase()["1"];
            tnew.Gep_ana_motstafase_chiusura = new GEP_ANA_MOTSTAFASE();
            tnew.Gep_ana_motstafase = new GEP_ANA_MOTSTAFASE();
            tnew.Fas_Note = tbNewNote.Text;
            tnew.Fas_Unit_Oper = ddlUo.SelectedValue;
            tnew.Fas_Dt_Arrivo = System.DateTime.Now;

            Info i = BasePage.Services.GestioneFasiService.closeAndOpen(temp, ref tnew);
            if (i.messageCount() > 0)
            {
                info = i;
                entity = temp;
                bindNew(false);
            }
            else
            {
                entity = tnew;
                bindNew(false);
            }
        }
        protected void btnCloseFase_OnClick(object sender, EventArgs e)
        {
            GEP_FASE temp = ParseFormData();
            //controllo date documentazione
            if (temp.Fas_Dt_Atto_Rich.HasValue && !temp.Fas_Dt_Atto_Ott.HasValue)
                info.AddMessage("Prima di chiudere la fase inserire la data di ottenimento dei documenti", LivelloMessaggio.WARNING);
            //controllo date sospensione
            if (temp.Fas_Dt_Inisosp.HasValue && !temp.Fas_Dt_Finesosp.HasValue)
                info.AddMessage("Prima di chiudere la fase inserire la data di fine sospensione", LivelloMessaggio.WARNING);

            entity = BasePage.Services.GestioneFasiService.getFaseById(decimal.Parse(currentFaseId));
            if (info.messageCount() == 0)
                entity.Gep_ana_statof.Id_stf_cod_stato = "98";
            bindNew(false);

        }

        private GEP_FASE ParseFormData()
        {
            GEP_FASE t = new GEP_FASE(decimal.Parse(currentFaseId),
                                       decimal.Parse(currentPraticaId),
                                       currentServiceId,
                                       decimal.Parse(currentNroFase));

            t.Fas_Progr_Fase = decimal.Parse(currentProgrFase);
            t.Fas_Dt_Arrivo=ParseDate(lblDataCreazione.Text);
            t.Fas_Dt_Atto_Ott=ParseDate(tbDataDocResp.Text);
            t.Fas_Dt_Atto_Rich=ParseDate(tbDataDocRic.Text);
            t.Fas_Dt_Finelav=ParseDate(lblDataChiusura.Text);
            t.Fas_Dt_Finesosp=ParseDate(tbDataEndSosp.Text);
            t.Fas_Dt_Inilav=ParseDate(lblDataPresaInCarico.Text);
            t.Fas_Dt_Inisosp= ParseDate(tbDataInitSosp.Text);
            
            //Parse della data effettiva dell'appuntamento
            t.Fas_Dtora_App=ParseDate(tbDataAppEff.Text);
            if (t.Fas_Dtora_App !=null && !string.IsNullOrEmpty(ddl_OraAppEff.SelectedValue))
            {
                t.Fas_Dtora_App=t.Fas_Dtora_App.Value.AddHours(int.Parse(ddl_OraAppEff.SelectedValue));
                if (!string.IsNullOrEmpty(ddl_MinAppEff.SelectedValue))
                    t.Fas_Dtora_App=t.Fas_Dtora_App.Value.AddMinutes(int.Parse(ddl_MinAppEff.SelectedValue));
            }

            //Parse della data dell'appuntamento dell'ASM
            t.Fas_Dtora_App_Proasm=ParseDate(tbDataAppAsm.Text);
            if (t.Fas_Dtora_App_Proasm != null && !string.IsNullOrEmpty(ddl_OraAppAsm.SelectedValue))
            {
                t.Fas_Dtora_App_Proasm = t.Fas_Dtora_App_Proasm.Value.AddHours(int.Parse(ddl_OraAppAsm.SelectedValue));
                if (!string.IsNullOrEmpty(ddl_MinAppAsm.SelectedValue))
                    t.Fas_Dtora_App_Proasm = t.Fas_Dtora_App_Proasm.Value.AddMinutes(int.Parse(ddl_MinAppAsm.SelectedValue));
            }

            //Parse della data dell'appuntamento data dell'Utente
            t.Fas_Dtora_App_Procli= ParseDate(tbDataAppUte.Text);
            if (t.Fas_Dtora_App_Procli != null && !string.IsNullOrEmpty(ddl_MinAppUte.SelectedValue))
            {
                t.Fas_Dtora_App_Procli = t.Fas_Dtora_App_Procli.Value.AddHours(int.Parse(ddl_OraAppUte.SelectedValue));
                if (!string.IsNullOrEmpty(ddl_MinAppUte.SelectedValue))
                    t.Fas_Dtora_App_Procli = t.Fas_Dtora_App_Procli.Value.AddMinutes(int.Parse(ddl_MinAppUte.SelectedValue));
            }
            
            t.Gep_ana_motstafase = new GEP_ANA_MOTSTAFASE(ddlMotivoSosp.SelectedValue);
            t.Gep_ana_motstafase_chiusura = new GEP_ANA_MOTSTAFASE(ddlEndFase.SelectedValue);
            
            t.Fas_Note=tbNote.Text;
            t.Gep_ana_statof = new GEP_ANA_STATOF(ddlStato.SelectedValue);
            t.Fas_Unit_Oper=lblUo.Text;
            return t;
        }

        protected string getDate(System.DateTime? dt)
        {
            if (dt.HasValue)
                return dt.Value.ToShortDateString();
            else return null;
        }

        protected string decodeMotivoChiusura()
        {
            if (string.IsNullOrEmpty(entity.Fas_Motivaz_Chiusura)) { lblMotivoChiusural.Text = null; return null; }
            else { lblMotivoChiusural.Text = "CHIUSA PER"; return BasePage.Services.AnagraficheService.getMotiviStatoChiusura()[entity.Fas_Motivaz_Chiusura].Mfa_des_motiv; }
        }

        protected string getOra(System.DateTime? dt)
        {
            if (dt.HasValue)
                return dt.Value.Hour.ToString().PadLeft(2,'0');
            else return null;
        }

        protected string getMinuto(System.DateTime? dt)
        {
            if (dt.HasValue)
                return dt.Value.Minute.ToString().PadLeft(2, '0');
            else return null;
        }

        private DateTime? ParseDate(string value)
        {
            DateTime temp;
            if (value == null || value.Length == 0)
                return null;
            else if (!System.DateTime.TryParse(value,out temp))
                throw new FormatException("Il formato data non è riconosciuto");
            return temp;
        }

        private void bindNew(bool initialize)
        {
        if (!string.IsNullOrEmpty(currentFaseId))
            {
                GEP_TESTATA current= common.SessionManager<GEP_TESTATA>.get(SessionKeys.CURRENT_TESTATA);
            
                if(initialize)
                    entity= BasePage.Services.GestioneFasiService.getFaseById(decimal.Parse(currentFaseId));
                
                if(current !=null && entity.Fas_cod_pratica == current.Id_tes_cod_pratica)
                    entity.Gep_testata=current;
                else
                {
                    entity.Gep_testata=BasePage.Services.GestioneInserimentoService.loadPratica_ByCode(entity.Fas_cod_pratica,false);
                    common.SessionManager<GEP_TESTATA>.set(SessionKeys.CURRENT_TESTATA,entity.Gep_testata);
                }
            }

            this.DataBind();
        }

        protected void Upload1_OnActions(Upload.commandName cmd, Upload.fileArgs args)
        {
            GEP_FASE.GEP_BLOB b = null;
            switch (cmd)
            {
                case Upload.commandName.SAVE:
                    b= new GEP_FASE.GEP_BLOB();
                    b.Blb_Id = decimal.Parse(currentFaseId);
                    b.Blb_doc=args.file;
                    b.Blb_intestazione_doc=args.name;
                    BasePage.Services.GestioneFasiService.document_Upload(b);
                    args.id = currentFaseId;
                    break;
                case Upload.commandName.LOAD:
                    b= BasePage.Services.GestioneFasiService.document_load(decimal.Parse(args.id));
                    args.name = b.Blb_intestazione_doc;
                    args.file = b.Blb_doc;
                    args.id = b.Blb_Id.ToString();
                    break;
                case Upload.commandName.DELETE:
                    BasePage.Services.GestioneFasiService.document_delete(decimal.Parse(args.id));
                    args.name = string.Empty;
                    args.id = "0";
                    break;
            }
            bindNew(true);
        }
    }
}
